home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5h.s < prev    next >
Text File  |  1994-07-07  |  7KB  |  231 lines

  1.  
  2. ; Lezione5h.s    ONDULAZIONE ORIZZONTALE DI UNA FIGURA COL $dff102
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28.  
  29. ;
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.  
  34.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  35.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  39.     bne.s    mouse        ; Se non ancora, non andare avanti
  40.  
  41.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  42.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  43.  
  44.     bsr.w    Ondula        ; fa ondulare la figura con molti $dff102 in
  45.                 ; copperlist
  46.  
  47. Aspetta:
  48.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  49.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  50.  
  51.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  52.     bne.s    mouse        ; se no, torna a mouse:
  53.  
  54.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  55.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  56.  
  57.     move.l    4.w,a6
  58.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  59.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  60.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  61.     rts            ; USCITA DAL PROGRAMMA
  62.  
  63. ;    Dati
  64.  
  65. GfxName:
  66.     dc.b    "graphics.library",0,0
  67.  
  68. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  69.     dc.l    0    ; della graphics.library
  70.  
  71. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  72.     dc.l    0
  73.  
  74. ; Questa routine e' simile a quella in Lezione3e.s, infatti vengono "spostati"
  75. ; dei valori come in una catena; vi ricordate il sistema gia' usato:
  76. ;    
  77. ;    move.w    col2,col1    ; col2 copiato in col1
  78. ;    move.w    col3,col2    ; col3 copiato in col2
  79. ;    move.w    col4,col3    ; col4 copiato in col3
  80. ;    move.w    col5,col4    ; col5 copiato in col4
  81. ;
  82. ; In questa routine invece di copiare colori si copiano valori del $dff102, ma
  83. ; il funzionamento della routine e' lo stesso. Per risparmiare LABEL e tempo
  84. ; la routine e' stata fornita di un ciclo DBRA che esegue la rotazione di
  85. ; quante word vogliamo: essendo le word da cambiare distanti 8 bytes, basta
  86. ; mettere l'indirizzo di una in a0 e dell'altra in a1 e lo spostamento avviene
  87. ; con un MOVE.W (a0),(a1). Poi passiamo alla coppia seguente aggiungendo 8
  88. ; ad a0 e a1, che punteranno alla prossima coppia di word da scambiare.
  89. ; Ricorderete che per fare il ciclo INFINITO bisogna che il primo valore sia
  90. ; sempre rimpiazzato dall'ultimo:
  91. ;
  92. ;     >>>>>>>>>>>>>>>>>>>>>    
  93. ;    ^               v
  94. ; In questo caso al termine del ciclo viene copiato il primo valore nell'ultimo
  95. ; per cui l'afflusso e' costante; la vecchia routine infatti terminava cosi':
  96. ;
  97. ;    move.w    col1,col14    ; col1 copiato in col14
  98. ;
  99.  
  100. Ondula:
  101.     LEA    CON1EFFETTO+8,A0 ; Indirizzo word sorgente in a0
  102.     LEA    CON1EFFETTO,A1    ; Indirizzo delle word destinazione in a1
  103.     MOVEQ    #44,D2        ; 45 bplcon1 da cambiare in COPLIST
  104. SCAMBIA:
  105.     MOVE.W    (A0),(A1)    ; copia due word consecutive - scorrimento!
  106.     ADDQ.W    #8,A0        ; prossima coppia di word
  107.     ADDQ.W    #8,A1        ; prossima coppia di word
  108.     DBRA    D2,SCAMBIA    ; ripeti "SCAMBIA" il numero giusto di VOLTE
  109.  
  110.     MOVE.W    CON1EFFETTO,ULTIMOVALORE ; per rendere infinito il ciclo
  111.     RTS                ; copiamo il primo valore nell'ultimo
  112.                     ; ogni volta.
  113.  
  114.  
  115.     SECTION    GRAPHIC,DATA_C
  116.  
  117. COPPERLIST:
  118.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  119.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  120.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  121.     dc.w    $13e,$0000
  122.  
  123.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  124.     dc.w    $90,$2cc1    ; DiwStop
  125.     dc.w    $92,$0038    ; DdfStart
  126.     dc.w    $94,$00d0    ; DdfStop
  127.  
  128.  
  129.     dc.w    $102        ; BplCon1 - IL REGISTRO
  130.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  131. MIOCON1:
  132.     dc.b    $00        ; BplCon1 - IL BYTE UTILIZZATO!!!
  133.  
  134.  
  135.     dc.w    $104,0        ; BplCon2
  136.     dc.w    $108,0        ; Bpl1Mod
  137.     dc.w    $10a,0        ; Bpl2Mod
  138.  
  139.             ; 5432109876543210
  140.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  141.                     ; 3 bitplanes lowres, non lace
  142. BPLPOINTERS:
  143.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  144.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  145.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  146.  
  147.     dc.w    $0180,$000    ; color0
  148.     dc.w    $0182,$475    ; color1
  149.     dc.w    $0184,$fff    ; color2
  150.     dc.w    $0186,$ccc    ; color3
  151.     dc.w    $0188,$999    ; color4
  152.     dc.w    $018a,$232    ; color5
  153.     dc.w    $018c,$777    ; color6
  154.     dc.w    $018e,$444    ; color7
  155.  
  156. ;    L'effetto nella copperlist: e' composto di un wait e un BPLCON1, i
  157. ;    wait aspettano una volta ogni 4 linee: $34,$38,$3c....
  158. ;    Nei $dff102 ci sono gia' i valori dell'"ONDA": 1,2,3,4...3,2,1.
  159.  
  160.     DC.W    $3007,$FFFE,$102
  161. CON1EFFETTO:
  162.     DC.W    $00
  163.     DC.W    $3407,$FFFE,$102,$00
  164.     DC.W    $3807,$FFFE,$102,$00
  165.     DC.W    $3C07,$FFFE,$102,$11
  166.     DC.W    $4007,$FFFE,$102,$11
  167.     DC.W    $4407,$FFFE,$102,$11
  168.     DC.W    $4807,$FFFE,$102,$11
  169.     DC.W    $4C07,$FFFE,$102,$22
  170.     DC.W    $5007,$FFFE,$102,$22
  171.     DC.W    $5407,$FFFE,$102,$22
  172.     DC.W    $5807,$FFFE,$102,$33
  173.     DC.W    $5C07,$FFFE,$102,$33
  174.     DC.W    $6007,$FFFE,$102,$44
  175.     DC.W    $6407,$FFFE,$102,$44
  176.     DC.W    $6807,$FFFE,$102,$55
  177.     DC.W    $6C07,$FFFE,$102,$66
  178.     DC.W    $7007,$FFFE,$102,$77
  179.     DC.W    $7407,$FFFE,$102,$88
  180.     DC.W    $7807,$FFFE,$102,$88
  181.     DC.W    $7C07,$FFFE,$102,$99
  182.     DC.W    $8007,$FFFE,$102,$99
  183.     DC.W    $8407,$FFFE,$102,$aa
  184.     DC.W    $8807,$FFFE,$102,$aa
  185.     DC.W    $8C07,$FFFE,$102,$aa
  186.     DC.W    $9007,$FFFE,$102,$99
  187.     DC.W    $9407,$FFFE,$102,$99
  188.     DC.W    $9807,$FFFE,$102,$88
  189.     DC.W    $9C07,$FFFE,$102,$88
  190.     DC.W    $A007,$FFFE,$102,$77
  191.     DC.W    $A407,$FFFE,$102,$66
  192.     DC.W    $A807,$FFFE,$102,$55
  193.     DC.W    $AC07,$FFFE,$102,$44
  194.     DC.W    $B007,$FFFE,$102,$44
  195.     DC.W    $B407,$FFFE,$102,$33
  196.     DC.W    $B807,$FFFE,$102,$33
  197.     DC.W    $BC07,$FFFE,$102,$22
  198.     DC.W    $C007,$FFFE,$102,$22
  199.     DC.W    $C407,$FFFE,$102,$22
  200.     DC.W    $C807,$FFFE,$102,$11
  201.     DC.W    $CC07,$FFFE,$102,$11
  202.     DC.W    $D007,$FFFE,$102,$11
  203.     DC.W    $D407,$FFFE,$102,$11
  204.     DC.W    $D807,$FFFE,$102,$00
  205.     DC.W    $DC07,$FFFE,$102,$00
  206.     DC.W    $E007,$FFFE,$102,$00
  207.     DC.W    $E407,$FFFE,$102
  208. ULTIMOVALORE:
  209.     DC.W    $00
  210.  
  211.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  212.  
  213. ;    figura
  214.  
  215. PIC:
  216.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  217.                     ; convertita col KEFCON, fatta di
  218.                     ; 3 bitplanes consecutivi
  219.  
  220.     end
  221.  
  222. Questo effetto di ondulazione e' un classico nell'Amiga. Per risparmiare qua
  223. non ondula ogni linea separatamente ma ogni quattro linee, ma almeno ha una
  224. routine con un loop veloce per scorrere i valori del $102 presenti nella
  225. copperlist.
  226.  
  227. La routine in questa lezione puo' essere utilizzata per "ruotare" qualsiasi
  228. gruppo di word, dunque puo' servire anche per effetti di scorrimento dei
  229. colori, o qualsiasi altro effetto.
  230.  
  231.